package com.taotao.manage.service.impl;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.baobao.common.service.RedisService;
import com.baobao.common.utils.JsonUtils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.taotao.manage.service.BasicService;
import com.taotao.manage.vo.ItemCatData;
import com.taotao.manage.vo.ItemCatResult;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.taotao.manage.pojo.ItemCat;

@Service
public class ItemCatService extends BasicService<ItemCat> {

    @Autowired
    private RedisService redisService;
    /**
     * 分级获取所有商品类目的数据
     *
     * @return
     */
    public ItemCatResult queryItemCatResult() {

        //尝试读取缓存
        String key = "taotao:manage:item:cat:";

        try {
            String jsonResult = redisService.get(key);
            if (StringUtils.isNotBlank(jsonResult)) {
                return JsonUtils.toObject(jsonResult, new TypeReference<ItemCatResult>() {
                });
            }
        } catch (IOException e) {
            e.printStackTrace();
        }


        ItemCatResult result = new ItemCatResult();

        // 查出全部数据
        List<ItemCat> itemCatList = super.queryAll();

        // 把所有数据封装成以parentId为key，以子类目的集合为value的map
        Map<Long, List<ItemCat>> itemCatMap = new HashMap<>();
        for (ItemCat itemCat : itemCatList) {
            if (!itemCatMap.containsKey(itemCat.getParentId())) {
                itemCatMap.put(itemCat.getParentId(), new ArrayList<ItemCat>());
            }
            itemCatMap.get(itemCat.getParentId()).add(itemCat);
        }

        // 封装一级类目：获取parentId为0的商品类目
        List<ItemCat> level1ItemCatList = itemCatMap.get(0l);
        for (ItemCat itemCat : level1ItemCatList) {
            // 创建一级类目对象
            ItemCatData itemCatData = new ItemCatData();
            // 把一级类目添加到result中
            result.getItemCats().add(itemCatData);
            // 一级类目的url
            itemCatData.setUrl("/products/" + itemCat.getId() + ".html");
            // 一级类目的name
            itemCatData.setName("<a href='/products/" + itemCat.getId() + ".html'>" + itemCat.getName() + "</a>");

            /// 二级类目：设置一级类目的子类目
            // 创建二级类目（ItemCatData）数组
            List<ItemCatData> level2ItemCatDataList = new ArrayList<>();
            // 设置到所属一级类目
            itemCatData.setItems(level2ItemCatDataList);
            // 获取一级类目下的所有二级类目
            List<ItemCat> level2ItemCatList = itemCatMap.get(itemCat.getId());
            for (ItemCat level2ItemCat : level2ItemCatList) {
                // 创建二级类目对象
                ItemCatData level2temCatData = new ItemCatData();
                level2ItemCatDataList.add(level2temCatData);
                // 设置二级类目的url
                level2temCatData.setUrl("/products/" + level2ItemCat.getId() + ".html");
                // 设置二级类目的name
                level2temCatData.setName(level2ItemCat.getName());

                /// 三级类目设置：设置二级类目的子类目
                List<String> level3ItemCatDataList = new ArrayList<>();
                // 设置到所属的二级类目
                level2temCatData.setItems(level3ItemCatDataList);
                // 获取该二级类目下的三级类目
                List<ItemCat> level3ItemCatList = itemCatMap.get(level2ItemCat.getParentId());
                for (ItemCat level3ItemCat : level3ItemCatList) {
                    level3ItemCatDataList.add("/products/" + level3ItemCat.getId() + ".html|" + level3ItemCat.getName());
                }
            }
        }

        //将结果写入缓存
        try {
            String json = JsonUtils.toString(result);
            redisService.setex(key,json,3600*24);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return result;
    }

//	@Autowired
//	private ItemCatMapper itemCatMapper;

//	public List<ItemCat> queryItemCatListByParentId(Long parent_id) {
//		ItemCat record = new ItemCat();
//		record.setParentId(parent_id);
//		return this.itemCatMapper.select(record);
//	}

//	@Override
//	public Mapper<ItemCat> getMapper() {
//		return this.itemCatMapper;
//	}

}
